/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MobileNode;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import messages.*;
import mobileipsimulation.NodeInterface;

/**
 *
 * @author Marko
 */
public class Receiver extends Thread {

    static NodeInterface ni;
    private int portReceiver;
    private DatagramSocket socket;
    private String pacote, mensagem[];
    private boolean activate;
    private MobileNode mn;

    public Receiver(MobileNode forme) {
        ni = forme.getNI();
        this.portReceiver = 2345;
        this.activate = true;
        this.mn = forme;
        this.start();
    }

    @Override
    public void run() {
        try {
            socket = new DatagramSocket(portReceiver);
            while (activate) {
                byte[] buffer = new byte[5000];
                DatagramPacket request = new DatagramPacket(buffer, buffer.length);
                socket.receive(request);
                pacote = new String(request.getData(), 0, request.getLength());
                //System.out.println("pacote: " + pacote);
                handlerMensagem(pacote.split(";"));
            }
            socket.close();
        } catch (SocketException e) {
            System.out.println("Socket: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IO: " + e.getMessage());
        }
    }

    private void handlerMensagem(String[] mensagem) {
        // System.out.println("node:recebi qq coisa " + mensagem[0]);
        if (mn.isHasSignal()) {
            if (mensagem[0].equals("AgentAdvertisment")) {
                //System.out.println("apanhei um adv do " + mensagem[2]);
                //System.out.println("de: " + mensagem[4] + " em: " + mensagem[2]);
                //System.out.println("msg: " + mensagem[3]);
                if (mn.getRegisteredAgent().equals("")) {
                    System.out.println("NENHUMA REGISTADA" + mensagem[2]);
                    if (mn.isHome()) {
                        System.out.println("registo na home");
                        RegistrationRequest rr = new RegistrationRequest(false, mn.getIpAddress(), mn.getHomeAddress(), mn.getMACAddress(), mensagem[2]);
                        mn.sendMessage("localhost", rr.toString(), 49552);
                    } else {
                        System.out.println("registo na for");
                        RegistrationRequest rr = new RegistrationRequest(false, mn.getIpAddress(), mn.getHomeAddress(), mn.getMACAddress(), mensagem[2]);
                        mn.sendMessage("localhost", rr.toString(), 49553);
                    }
                } else if (mn.getRegisteredAgent().equals("home")) {
                    if (!mn.isHome()) {
                        System.out.println("Nao estou na home e vou registar na foreing ");
                        RegistrationRequest rr = new RegistrationRequest(false, mn.getIpAddress(), mn.getHomeAddress(), mn.getMACAddress(), mensagem[2]);
                        mn.sendMessage("localhost", rr.toString(), 49553);
                    }
                } else if (mn.getRegisteredAgent().equals("foreign")) {
                    if (mn.isHome()) {
                        System.out.println("estou na home e vou registar na home ");
                        RegistrationRequest rr = new RegistrationRequest(false, mn.getIpAddress(), mn.getHomeAddress(), mn.getMACAddress(), mensagem[2]);
                        mn.sendMessage("localhost", rr.toString(), 49552);
                    }
                }
            } else if (mensagem[0].equals("Confirmation")) {
                if (mensagem[1].equals("Sucesso")) {
                    mn.setCareOfAddress(mensagem[2]);
                    System.out.println("Ligaçao Confirmada em " + mensagem[2]);
                    mn.setRegisteredAgent(mensagem[2]);
                    mn.setConnected(true);
                } else {
                    System.out.println("Erro a estabelecer ligaçao");
                    mn.setRegisteredAgent("");
                    mn.setConnected(false);
                }
            } else if (mensagem[0].equals("Packet")) {
                ni.printMe("Received: " + mensagem[3]);
                System.out.println("Recebi: " + mensagem[3]);
            }
        }
    }
}
